<?php
/**
 * coreController
 *
 * 페이지 컨트롤러 추상화 클래스
 *
 * @package core
 * @author  Platform Team
 */

abstract class coreController extends Controller
{
    /**
     * 캐릭터셋
     */
    protected $encodingType;

    /**
     * 템플릿명
     */
    protected $template = 'default';

    /**
     * 페이지 타이틀명
     */
    protected $title = 'Simplex Web Platform';

    /**
     * 템플릿에 활용 될 사용자 정의형 데이터
     */
    protected $customs = array();

    /**
     * 메타 태그 리스트
     */
    protected $metaContents = array();

    /**
     * 컨텐츠 타입명(헤더에 지정될 mimeType) - html, xml, json .....
     */
    protected $contentType = 'html';

    /**
     * 추가 VIEW 데이터
     */
    protected $viewDataAdd = false;

    /**
     * 모델 객체 반환
     *
     * @param string $sName    클래스명 : model 접두어를 제외한 나머지
     * @param array $aDsn     DSN 정보 : 기본은 FW.database
     * @return mixed
     */
    public function model($sName, $aDsn=null)
    {
        return $this->model->load(FW_CLASS_PREFIX_MODEL . $sName, $aDsn);
    }

    /**
     * 뷰 출력
     *
     * @param string $sPath    경로
     * @param array $aData    키=>값 형태의 데이터
     * @param boolean $isPrint  브라우져 기본 출력 여부 (기본 : true)
     * @return boolean | string
     */
    public function view($sPath, $aData=null, $isPrint=true)
    {
        return $this->view->display(FW_DIR_VIEW . '/contents', FW_DIR_RESOURCE, $sPath, $aData, $isPrint, $this->viewDataAdd);
    }

    /**
     * 언어팩에 정의된 값 반환
     *
     * @deprecated
     * @param string $sName    정의한 키 이름
     * @return string
     */
    public function lang($sName)
    {
        return $this->lang->read(FW_DIR_RESOURCE, $sName);
    }

    /**
     * JS 추가
     *
     * @param string $sPath        경로
     * @param string $sAppendType  추가 타입(after , before)
     * @param string $sRoot        루트 디렉토리
     * @return boolean
     */
    public function js($sPath, $sAppendType=null, $sRoot=FW_DIR_JS)
    {
        return $this->optimizer->addJS($sRoot, $sPath, $sAppendType);
    }

    /**
     * CSS 추가
     *
     * @param string $sPath        경로
     * @param string $sAppendType  추가 타입(after , before)
     * @param string $sRoot        루트 디렉토리
     * @return boolean
     */
    public function css($sPath, $sAppendType=null, $sRoot=FW_DIR_CSS)
    {
        return $this->optimizer->addCSS($sRoot, $sPath, $sAppendType);
    }

    /**
     * JS 소스 추가
     *
     * @param string $sSource
     * @return boolean
     */
    public function writeJS($sSource)
    {
        return $this->optimizer->writeJS($sSource);
    }

    /**
     * CSS 소스 추가
     *
     * @param string $sSource
     * @return boolean
     */
    public function writeCSS($sSource)
    {
        return $this->optimizer->writeCSS($sSource);
    }

    /**
     * 외부 JS URL 추가
     *
     * @param string $sUrl
     * @param string $sCharset     캐릭터셋  (기본 : utf-8)
     * @param string $sAppendType  추가 타입 (기본 : main) - after , before
     * @return boolean
     */
    public function externalJS($sUrl, $sCharset='utf-8', $sAppendType=null)
    {
        return $this->optimizer->externalJS($sUrl, $sCharset, null, $sAppendType);
    }

    /**
     * 외부 CSS URL 추가
     *
     * @param string $sUrl
     * @param string $sCharset     캐릭터셋  (기본 : utf-8)
     * @param string $sAppendType  추가 타입 (기본 : main) - after , before
     * @return boolean
     */
    public function externalCSS($sUrl, $sCharset='utf-8', $sAppendType=null)
    {
        return $this->optimizer->externalCSS($sUrl, $sCharset, null, $sAppendType);
    }

    /**
     * 동적 데이터 참조 JS 파일 추가
     *
     * @param string $sPath 경로
     * @param array $aData 데이터 array( 키 => 밸류, ... )
     * @param string $sRoot 루트 경로
     */
    public function pJS($sPath, $aData=array(), $sRoot=FW_DIR_PJS)
    {
        return $this->optimizer->pJS($sRoot, $sPath, $aData);
    }

    /**
     * 동적 데이터 참조 CSS 파일 추가
     *
     * @param string $sPath 경로
     * @param array $aData 데이터 array( 키 => 밸류, ... )
     * @param string $sRoot 루트 경로
     */
    public function pCSS($sPath, $aData=array(), $sRoot=FW_DIR_PCSS)
    {
        return $this->optimizer->pCSS($sRoot, $sPath, $aData);
    }

    /**
     * 페이지 캐릭터셋 반환
     *
     * @return string
     */
    public function getEncodingType()
    {
        return $this->encodingType;
    }

    /**
     * 페이지 캐릭터셋 세팅
     *
     * @param string $sVal
     */
    public function setEncodingType($sVal)
    {
        $this->encodingType = $sVal;
    }

    /**
     * 템플릿명 반환
     *
     * @return string
     */
    public function getTemplate()
    {
        return $this->template;
    }

    /**
     * 템플릿명 세팅
     */
    public function setTemplate($sVal)
    {
        $this->template = $sVal;
    }

    /**
     * 페이지 타이틀 명
     *
     * @return string
     */
    public function getTitle()
    {
        return $this->title;
    }

    /**
     * 페이지 타이틀 명 세팅
     */
    public function setTitle($sVal)
    {
        $this->title = $sVal;
    }

    /**
     * 템플릿용 사용자 정의형 데이터
     *
     * @return array
     */
    public function getCustom()
    {
        return $this->customs;
    }

    /**
     * 템플릿용 사용자 정의형 데이터 세팅
     */
    public function setCustom($mCustom)
    {
        $this->customs = $mCustom;
    }

    /**
     * 컨텐츠 타입 반환
     *
     * @return string | false
     */
    public function getContentType()
    {
        return $this->contentType;
    }

    /**
     * 컨텐츠 타입 세팅
     */
    public function setContentType($sVal)
    {
        $this->contentType = $sVal;
    }

    /**
     * 메타 태그 리스트 반환
     *
     * @return array
     */
    public function getMetaContent()
    {
        return $this->metaContents;
    }

    /**
     * 메타 컨텐츠 세팅
     * <meta name="이름" content="컨텐츠" />
     *
     * @param string $sName
     * @param string $sContents
     */
    public function setMetaContent($sName, $sContents)
    {
        $this->metaContents[$sName] = sprintf('<meta name="%s" content="%s" />'."\n", $sName, $sContents);
    }

    /**
     * 추가 VIEW 데이터
     */
    public function setViewDataAdd($aData)
    {
        $this->viewDataAdd = $aData;
    }
}